//package com.fy.fyspace.common.websocket;
//
//import cn.dev33.satoken.stp.StpInterface;
//import cn.hutool.core.util.ObjUtil;
//import cn.hutool.core.util.StrUtil;
//import com.fy.fyspace.common.auth.StpKit;
//import com.fy.fyspace.common.auth.authenum.SpaceUserPermissionEnum;
//import com.fy.fyspace.constant.KeysConstant;
//import com.fy.fyspace.model.entity.Picture;
//import com.fy.fyspace.model.entity.Space;
//import com.fy.fyspace.model.enums.space.SpaceTypeEnum;
//import com.fy.fyspace.model.vo.user.UserSessionVO;
//import com.fy.fyspace.service.PictureService;
//import com.fy.fyspace.service.SpaceService;
//import com.fy.fyspace.service.UserService;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.http.server.ServerHttpRequest;
//import org.springframework.http.server.ServerHttpResponse;
//import org.springframework.http.server.ServletServerHttpRequest;
//import org.springframework.stereotype.Component;
//import org.springframework.web.socket.WebSocketHandler;
//import org.springframework.web.socket.server.HandshakeInterceptor;
//
//import javax.annotation.Resource;
//import javax.servlet.http.HttpServletRequest;
//import java.util.List;
//import java.util.Map;
//
///**
// * WebSocket 拦截器，建立连接前要先校验
// */
//@Slf4j
//@Component
//public class WsHandshakeInterceptor implements HandshakeInterceptor {
//
//    @Resource
//    private UserService userService;
//
//    @Resource
//    private PictureService pictureService;
//
//    @Resource
//    private SpaceService spaceService;
//
//    @Resource
//    private StpInterface stpInterface;
//
//    /**
//     * 建立连接前要先校验
//     *
//     * @param request
//     * @param response
//     * @param wsHandler
//     * @param attributes 给 WebSocketSession 会话设置属性
//     * @return
//     * @throws Exception
//     */
//    @Override
//    public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {
//        if (request instanceof ServletServerHttpRequest) {
//            HttpServletRequest httpServletRequest = ((ServletServerHttpRequest) request).getServletRequest();
//            // 从请求中获取参数
//            String pictureId = httpServletRequest.getParameter("pictureId");
//            if (StrUtil.isBlank(pictureId)) {
//                log.error("缺少图片参数，拒绝握手");
//                return false;
//            }
//            // 获取当前登录用户
//            UserSessionVO loginUser = (UserSessionVO) httpServletRequest.getSession().getAttribute(KeysConstant.LOGIN_SESSION_KEY);
//            if (ObjUtil.isEmpty(loginUser)) {
//                log.error("用户未登录，拒绝握手");
//                return false;
//            }
//            // 校验用户是否有编辑当前图片的权限
//            Picture picture = pictureService.getById(pictureId);
//            if (ObjUtil.isEmpty(picture)) {
//                log.error("图片不存在，拒绝握手");
//                return false;
//            }
//            Long spaceId = picture.getSpaceId();
//            Space space = null;
//            if (spaceId != null) {
//                space = spaceService.getById(spaceId);
//                if (ObjUtil.isEmpty(space)) {
//                    log.error("图片所在空间不存在，拒绝握手");
//                    return false;
//                }
//                if (space.getSpaceType() != SpaceTypeEnum.TEAM.getSpaceType()) {
//                    log.error("图片所在空间不是团队空间，拒绝握手");
//                    return false;
//                }
//            }
//            List<String> permissionList = stpInterface.getPermissionList(space, StpKit.SPACE.loginType);
//            if (!permissionList.contains(SpaceUserPermissionEnum.PICTURE_EDIT.getPermissionId())) {
//                log.error("用户没有编辑图片的权限，拒绝握手");
//                return false;
//            }
//            // 设置用户登录信息等属性到 WebSocket 会话中
//            attributes.put("user", loginUser);
//            attributes.put("userId", loginUser.getId());
//            attributes.put("pictureId", Long.valueOf(pictureId)); // 记得转换为 Long 类型
//        }
//        return true;
//    }
//
//    @Override
//    public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) {
//    }
//}
